package com.thinkTank.oa.service;


import java.util.List;

import javax.validation.Valid;

import org.springframework.web.multipart.MultipartFile;

import com.thinkTank.oa.base.BaseService;
import com.thinkTank.oa.entity.Demand;
import com.thinkTank.oa.entity.Person;
import com.thinkTank.oa.entity.Project;

/**
 * 专家service层
 * @author 董力
 * 2018-8-9
 */
public interface PersonService extends BaseService<Person> {

	/**
	 * 新增
	 * @param person
	 */
	public void addPerson(Person person);
	
	/**
	 * 模糊查询专家表
	 * @param map
	 * @return
	 */
	public List<Person> findMPersonList(Person person);
	
	/**
	 * 通过pid查询专家
	 * @param id
	 * @return
	 */
	public Person findPersonByPid(String pid);
	
	/**
	 * 通过姓名、电话、邮箱查询专家
	 * @param person
	 * @return
	 */
	public Person findPersonByNameAndTellAndEmail(Person person);
	
	/**
	 * 修改
	 * @param person
	 */
	public void updatePerson(Person person);

	/**
	 * 添加项目持有人
	 * @author pdz
	 * @date 2018年8月15日
	 * @param person 页面上添加的人
	 * @param project 从project列表点击添加时携带的project
	 * @param file 上传的文件
	 */
    public void addHolder(Person person, Project project, MultipartFile file);
	
	/**
	 * 通过5种联系方式的or查询和名字查询，如：<br/>
	 * select * from t_person where (email = 'yhyan@jtk800.com' or tell = '13112312344') and name = '张杰';
	 * @author pdz
	 * @date 2018年8月15日
	 * @return
	 */
    List<Person> queryByContactAndName(Person person);

    /**
     * 添加项目联系人，在项目表里面直接将联系人的名字改为外键
     * @author pdz
     * @date 2018年8月16日
     * @param person
     * @param project
     * @param annex 附件
     */
    public void addContact(Person person, Project project, MultipartFile file);

    /**
     * 添加需求联系人，在需求表里面直接将联系人的名字改为外键
     * @author pdz
     * @date 2018年8月22日
     * @param person
     * @param demand
     */
    public void addContact(Person person, Demand demand, MultipartFile file);
    /**
     * personIdList通过in关键字查询出person集合
     * @author pdz
     * @date 2018年8月17日
     * @param personIdList
     * @return
     */
    public List<Person> queryByPersonIdList(List<String> personIdList);

    /**
     * 修改项目持有人，并同步修改项目表中的持有人字段
     * @author pdz
     * @date 2018年8月17日
     * @param person
     * @param project
     * @param oldHolderName 持有人原来的名字
     * @param file 上传的文件
     */
    public void updateHolder(Person person, MultipartFile file);

    /**
     * 根据项目id查询持有人
     * @author pdz
     * @date 2018年8月20日
     * @param projectId
     * @return
     */
    public List<Person> queryHolders(String projectId);

    /**
     * 修改联系人
     * @author pdz
     * @date 2018年8月27日
     * @param person
     * @param file 上传的文件
     */
    public void update(@Valid Person person, MultipartFile file);
    
    /**
     * 通过姓名+任意一种联系方式查询专家
     * @author dongli
     * @date 2018年9月5日
     * @param person
     * @return
     */
    public Person findPersonByInfo(Person person);

    /**
     * 导入专家，以名字和任一联系方式判断person是否存在，只有不存在才导入
     * @author pdz
     * @date 2018年9月11日
     * @param person
     */
    public void importData(Person person);
    
    /**
     * 修改联系人或持有人时判断是否已经存在
     * @param person
     * @return
     */
    boolean updatePersonExists(Person person);
    public List<Person> findPersonByIndex(Integer count);
    
    /**
     * 通过id直接将project和person关联起来
     * @author pdz
     * @date 2018年10月18日
     * @param projectId
     * @param personId
     */
    int linkHolder(String projectId, String personId);
    
    /**
     * 模糊分页查询专家表
     * @author dongli
     * @date 2018年11月9日
     * @param person
     * @return
     */
    public List<Person> findMFPersonList(Person person);

    /**
     * 根据expertNumber进行in查询
     * @author pdz
     * @date 2018年11月8日
     * @param expertNumberList
     * @return
     */
    List<Person> queryInExpertNumber(List<Integer> expertNumberList);
}
